iT邦幫忙

2026 iThome 鐵人賽

DAY 3
0
自我挑戰組

Python 爬蟲與資料分析實戰:從網路資料到資訊視覺化系列 第 10 篇

Day 10|Python 爬蟲實戰:使用 Requests 與 BeautifulSoup 抓取書籍資料

  • 分享至 

  • xImage
  •  

前幾天已經學會 Python 的基本語法、資料結構、函式、檔案處理,以及如何使用 Requests 取得網頁內容和 BeautifulSoup 解析 HTML。

從今天開始,會把這些內容整合起來,正式進入網頁爬蟲的實作。

這次選擇 Books to Scrape 作為練習網站,實際抓取書籍名稱、價格、庫存狀態和評分,並將資料整理成 Python 的 List 和 Dictionary,最後進行簡單的資料分析。

今天的重點是理解一個完整的爬蟲流程:發送請求 → 解析 HTML → 擷取資料 → 整理資料 → 初步分析。

一、認識今天的練習網站

今天使用的網站是 Books to Scrape。

這是一個專門提供網頁爬蟲練習的網站,頁面中有許多書籍資料,包含書名、價格、庫存狀態和評分,很適合用來練習資料擷取。

網站網址:https://books.toscrape.com/

在開始寫程式之前,先觀察網頁的內容,了解我們要抓取哪些資訊。

這次預計取得以下四個欄位:

title
書籍名稱
price
書籍價格
availability
庫存狀態
rating
書籍評分

這些資料原本分散在網頁的 HTML 結構中,接下來會透過 Python 將它們整理成方便分析的格式。

二、實作一:使用 Requests 取得網頁內容

首先,在 Google Colab 建立一個新的 Notebook,並匯入 Requests 套件。

Requests 可以用來向網站發送 HTTP 請求,取得伺服器回傳的網頁內容。

import requests

url = "https://books.toscrape.com/
"

response = requests.get(url, timeout=10)

print("狀態碼:", response.status_code) print(response.text[:500])

這段程式碼主要分成三個部分。

第一,使用 requests.get() 向網站發送 GET 請求。

第二,將回傳的結果存放在 response 變數中。

第三,使用 response.status_code 確認請求狀態,並透過 response.text 取得 HTML 原始碼。

如果狀態碼是 200,通常代表請求成功。

這裡使用 [:500] 是為了只顯示前 500 個字元,避免整個網頁的 HTML 一次輸出太多內容。

執行結果

正常情況下,可以看到類似以下的輸出:

狀態碼:200

接著會顯示網頁 HTML 的開頭內容,例如 、 和 等標籤。

這代表我們已經成功取得網頁原始碼,接下來就可以開始解析 HTML。

三、實作二:使用 BeautifulSoup 解析 HTML

取得 HTML 之後,接著使用 BeautifulSoup 將原始碼轉換成方便搜尋的結構。

from bs4 import BeautifulSoup

soup = BeautifulSoup(response.text, "html.parser")

print(soup.title.text)

這裡使用 BeautifulSoup() 解析 HTML,並將結果存放在 soup 變數中。

"html.parser" 是 Python 內建的 HTML 解析器,可以用來讀取網頁的標籤結構。

接著使用 soup.title.text 取得網頁標題的文字內容。

這個步驟的目的,是讓我們不需要直接處理整份 HTML 字串,而是可以透過標籤名稱、class 或 CSS Selector 找到需要的資料。

找出所有書籍區塊

在 Books to Scrape 的網頁中,每本書都放在 article 標籤裡,並且具有 product_pod 這個 class。

因此,可以使用 CSS Selector 一次找出所有書籍。

books = soup.select("article.product_pod")

print("找到的書籍數量:", len(books))

這裡的 select() 可以使用 CSS Selector 搜尋符合條件的元素。

article.product_pod 的意思是尋找標籤名稱為 article,而且 class 是 product_pod 的元素。

len(books) 則可以確認目前取得了多少個書籍區塊。

這樣就能將網頁中的每本書分別取出,方便後續逐一處理。

四、實作三:抓取第一本書的名稱與價格

找到書籍區塊後,先從第一本書開始練習。

book = books[0]

title = book.select_one("h3 a")["title"] price = book.select_one(".price_color").text

print("書名:", title) print("價格:", price)

這裡使用 books[0] 取得 List 中的第一本書。

接著使用 select_one() 找出書名和價格。

書名位於 h3 標籤裡面的 a 標籤中,而完整書名可以從 title 屬性取得。

價格則位於 class 為 price_color 的元素中,因此可以透過 .text 取得文字內容。

這個步驟讓我們先確認選取的 HTML 元素是否正確,再將相同的方式套用到其他書籍。

將價格轉換成數字

目前取得的價格可能是 £51.77 這樣的字串。

如果想要計算平均價格或比較價格,就必須先移除貨幣符號,再將字串轉換成數字。

price_text = book.select_one(".price_color").text

price = float(price_text.replace("£", ""))

print("原始價格:", price_text) print("轉換後價格:", price)

這裡使用 replace("£", "") 移除英鎊符號,再使用 float() 將價格轉換成浮點數。

轉換完成後,價格就可以用來進行數值運算。

五、實作四:取得庫存狀態與評分

除了書名和價格,這次也會抓取書籍的庫存狀態和評分。

book = books[0]

availability = book.select_one(".availability").text.strip()

rating_element = book.select_one(".star-rating") rating = rating_element["class"][1]

print("庫存狀態:", availability) print("評分:", rating)

庫存狀態可以透過 .availability 找到,再使用 strip() 移除前後多餘的空白和換行。

評分則是從 star-rating 這個元素的 class 取得。

網站會用 One、Two、Three、Four、Five 表示一到五星,因此這裡取得的評分是英文文字,而不是數字。


上一篇
Day 9|BeautifulSoup 進階:使用 class、id 與 CSS Selector 精準擷取資料
下一篇
Day 11|Python 爬蟲實戰:突破單頁限制,使用 Requests 與 BeautifulSoup 爬取多頁資料
系列文
Python 爬蟲與資料分析實戰:從網路資料到資訊視覺化 共 13 篇
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言